/*
 *	               _ooOoo_ 
 *	              o8888888o 
 *	              88" . "88 
 *	              (| -_- |) 
 *	              O\  =  /O 
 *	           ____/`---'\____ 
 *	         .'  \\|     |//  `. 
 *	        /  \\|||  :  |||//  \ 
 *	       /  _||||| -:- |||||-  \ 
 *	       |   | \\\  -  /// |   | 
 * 	       | \_|  ''\---/''  |   | 
 * 	       \  .-\__  `-`  ___/-. / 
 * 	    ___ `. .'  /--.--\  `. . __ 
 *	  ."" '<  `.___\_<|>_/___.'  >'"". 
 *	 | | :  `- \`.;`\ _ /`;.`/ - ` : | | 
 *	 \  \ `-.   \_ __\ /__ _/   .-` /  / 
 *======`-.____`-.___\_____/___.-`____.-'====== 
 *                   `=---=' 
 *^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
 *佛祖保佑       永无BUG 
 */
package com.jmar.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 全局拦截器
 * <p>
 * Author: iokane
 * <p>
 * Date:2014-12-28 Time:上午11:52:44
 * <p>
 */
public class Interceptor implements HandlerInterceptor {

	private Logger log = Logger.getLogger(Interceptor.class);

	// @Autowired
	// private UserServiceI userService;

	/**
	 * 在请求处理之前执行，该方法主要是用于准备资源数据的，然后可以把它们当做请求属性放到WebRequest中
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object obj) throws Exception {
		// response.setContentType("text/html;charset=UTF-8");
		// request.setCharacterEncoding(Constant.UTF8);
		// HandlerMethod handler = (HandlerMethod) obj;
		// String pp = IpUtil.projectPath(request);
		//
		// ServletContext application =
		// request.getSession().getServletContext();
		// Boolean load = (Boolean) application
		// .getAttribute("_all_exma_base_info_load");
		// if (null == load || !load) {
		// String sp = IpUtil.serverPath(request);
		// application.setAttribute("_all_exma_base_info_load", true);
		// // 地区真题
		// application.setAttribute("_all_middle_area", find_base(0, 1));
		// application.setAttribute("_all_high_area", find_base(0, 2));
		// application.setAttribute("_all_exam_area", find_base(0, -1));
		// application.setAttribute("_all_book_diffSerial", find_base(1));
		// // 题目来源
		// application.setAttribute("_all_exam_from", find_base(2));
		// // 题型
		// application.setAttribute("_all_exam_type", find_base(3));
		// application.setAttribute("_all_exam_year", find_base(4));
		// application.setAttribute("_all_course", find_base(5));
		// application.setAttribute("_all_grade", find_base(6));
		// application.setAttribute("_all_semester", find_base(7));
		// application.setAttribute("_all_middle_semester", find_base(7, 1));
		// application.setAttribute("_all_high_semester", find_base(7, 2));
		// // application.setAttribute("_all_book_version",
		// // find_base(8));
		// application.setAttribute("_all_book_select", BaseData.selectMap);
		// application.setAttribute("pp", pp);
		// application.setAttribute("sp", sp);
		// }
		// JSONArray array = (JSONArray) application
		// .getAttribute("_all_exam_area");
		// String ipAddr = IpUtil.getIpProvince(request);
		// JSONObject j = null;
		// for (Object o : array) {
		// j = (JSONObject) o;
		// String area = (String) j.get("value");
		// if (!area.replace("省", "").replace("市", "")
		// .equals(ipAddr.replace("省", "").replace("市", ""))) {
		// continue;
		// }
		// request.getSession()
		// .setAttribute("ip_area", (Integer) j.get("key"));
		// }
		//
		// // 校验权限
		// UserAuthority userAuthority = handler
		// .getMethodAnnotation(UserAuthority.class);
		// if (userAuthority == null) {
		// return true;
		// }
		// MethodParameter mp = handler.getReturnType();
		// // 获取拦截的方法的返回类型的名�?
		// String returnTypeName = mp.getParameterType().getSimpleName();
		// User user = (User) request.getSession().getAttribute("user");
		// if (user == null) {
		// if (ModelAndView.class.getSimpleName().equals(returnTypeName)) {
		// String queryString = request.getQueryString();
		// String backUrl = request.getRequestURI();
		// request.getSession().setAttribute("backUrl",
		// backUrl + "?" + queryString);
		// response.sendRedirect(pp + "/sign_in");
		// } else if (JSONObject.class.getSimpleName().equals(returnTypeName)) {
		// JSONObject json = new JSONObject();
		// json.put("success", false);
		// json.put("msg", "您未登录!");
		// response.getWriter().write(JSONObject.toJSONString(json));
		// } else {
		// response.getWriter()
		// .write("<span style='color:red;'>您没有登录或者您的请求是非法请求，请联系管理员!</span>");
		// }
		// return false;
		// }
		// last_use_system(user);
		// // 将登录用户实例放入threadLocal�?以便该线程处理时�?��用到登录用户对象
		// // 检查用户最后登录时间信息
		// threadLocal.set(user);
		// // 注解上面的Power
		// Power[] ps = userAuthority.value();
		// if (null == ps || 0 == ps.length) {
		// log_msg(user, handler);
		// return true;
		// }
		// // 用户的角色
		// Role userRole = user.getRole();
		// String powers = userRole.getPowers();
		// List<Integer> power_list = BaseUtil.strToList(powers);
		// for (Integer p : power_list) {
		// if (-1 == p) {
		// log_msg(user, handler);
		// return true;
		// }
		// for (Power temp : ps) {
		// if (p == temp.ordinal()) {
		// log_msg(user, handler);
		// return true;
		// }
		// }
		// }
		// // 下面的代表无法通过注解验证的情况
		// if (ModelAndView.class.getSimpleName().equals(returnTypeName)) {
		// response.sendRedirect("../error/401");
		// } else if (JSONObject.class.getSimpleName().equals(returnTypeName)) {
		// JSONObject json = new JSONObject();
		// json.put("success", false);
		// json.put("msg", "权限不够,无法操作");
		// response.getWriter().write(JSONObject.toJSONString(json));
		// } else {
		// response.getWriter().write("非法请求");
		// }
		return true;
	}

	/**
	 * 该方法将在Controller执行之后，
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	/**
	 * 该方法将在整个请求完成之后，也就是说在视图渲染之后进行调用，主要用于进行一些资源的释放
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object obj, Exception ex)
			throws Exception {
		if (null != ex) {
			String str = ex.toString();
			if (str.indexOf("Software caused connection abort: socket write error") > -1
					|| str.indexOf("Connection reset by peer: socket write error") > -1) {
				return;
			}
			HandlerMethod handler = (HandlerMethod) obj;
			log.error(handler.getBeanType().toString() + "."
					+ handler.getMethod().getName(), ex);
		}
	}

	// public UserServiceI getUserService() {
	// return userService;
	// }
	//
	// public void setUserService(UserServiceI userService) {
	// this.userService = userService;
	// }

}
